package org.pms.core.service;

import java.util.List;

import org.apache.log4j.Logger;
import org.pms.core.dao.PersonDao;
import org.pms.core.dao.PersonDaoImpl;
import org.pms.core.entity.Person;
import org.pms.core.exception.DataAccessException;
import org.pms.core.exception.ServiceException;

/**
 * Serviços do cadastro de pessoas
 * 
 * @author Paulo
 *
 */
public class PersonServiceImpl implements PersonService {
	private static Logger logger = Logger.getLogger(PersonServiceImpl.class);
	
    private PersonDao personDao;
	
    /**
     * Instancia dependencias do serviço
     */
	public PersonServiceImpl() {
		personDao = new PersonDaoImpl();
	}

	/**
	 * Efetua busca de todas as pessoas
	 * @return List<Person> todas as pessoas
	 */
	@Override
	public List<Person> findAllPerson() throws ServiceException {
		List<Person> persons = null;
		
		try {
			persons = personDao.findAll();
		} catch (DataAccessException de) {
			throw new ServiceException("Ocorreu um erro ao procurar pessoas!");
		} catch (Exception e) {
			logger.error("Ocorreu um erro no servico PersonService:",e);
			throw new ServiceException("Ocorreu um erro genérico!");
		}
		
		return persons;
		
	}
	
	/**
	 * Procura pessoa pelo seu identificador
	 * @param id
	 * @return
	 */
	@Override
	public Person findPersonById(Integer id) throws ServiceException {
		// validar se identificador diferente de null
		if (id == null) {
			throw new ServiceException("Identificador inválido!");
		}
		
		Person person = null;
		try {
			person = personDao.findById(id);
		} catch (DataAccessException de) {
			throw new ServiceException("Ocorreu um erro ao procurar a pessoa com identificador "+id+"!");
		} catch (Exception e) {
			logger.error("Ocorreu um erro no servico PersonService:",e);
			throw new ServiceException("Ocorreu um erro genérico!");
		}
		
		return person;
	}
	
	/**
	 * Salva os dados da pessoa no banco de dados
	 * @param person dados da pessoa a serem salvos
	 * @return Person dados da pessoa após serem salvos
	 */
	@Override
	public Person savePerson(Person person) throws ServiceException {
		// regras de negócio para validação antes de salvar
		// valida se person diferente de null
		if (person == null) {
			throw new ServiceException("Parametro inválido!");
		}
		
		try {
			person = personDao.saveOrUpdate(person);
		} catch (DataAccessException de) {
			throw new ServiceException("Ocorreu um erro ao salvar a pessoa!");
		} catch (Exception e) {
			logger.error("Ocorreu um erro no servico PersonService:",e);
			throw new ServiceException("Ocorreu um erro genérico!");
		}
		
		return person;
	}
	
	/**
	 * Remove pessoa do banco de dados
	 * @param person pessoa a ser removida
	 */
	@Override
	public void delete(Person person) throws ServiceException {
		// regras de negóco que validem se pode excluir pessoa
		// valida se person diferente de null
		if (person == null) {
			throw new ServiceException("Parametro inválido!");
		}
		try {
			personDao.delete(person);
		} catch (DataAccessException de) {
			throw new ServiceException("Ocorreu um erro ao salvar a pessoa!");
		} catch (Exception e) {
			logger.error("Ocorreu um erro no servico PersonService:",e);
			throw new ServiceException("Ocorreu um erro genérico!");
		}
	}
}
